package com.zj.config;

import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

import javax.servlet.Filter;

//web容器启动的时候扫描到spring-web包下的META-INF/services/servletContainerInitializer这个文件中记录的
// 类SpringServletContainerInitializer实例化该类并运行该类的onStartUp方法。该方法会获取它类上标记的感兴趣的
// 类（WebApplicationInitializer的子类）实例化它们并依次调用他们的onstartup方法，
//AbstractContextLoaderInitializer在onstartup中调用了createRootApplicationContext方法创建根容器但该方法未实现
//AbstractDispatcherServletInitializer在onstartup中先调用父类的onstartup相当于创建了跟容器，让后调用了createServletApplicationContext创建web容器但未实现。
//AbstractAnnotationConfigDispatcherServletInitializer直接重写了createRootApplicationContext和createServletApplicationContext逻辑
// 但分别在两个方法中留下了getRootConfigClasses和getServletConfigClasses方法未实现，留给子类传入配置类即可创建完整的一套容器。
//重写这些获取配置类方法可以供AbstractAnnotationConfigDispatcherServletInitializer根据配置类创建容器
//总之就是META-INF/services/servletContainerInitializer机制暴露了一个给用户自由创建容器并启动的机会
public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    //根容器、父容器配置，即spring配置类
    @Override
    protected Class<?>[] getRootConfigClasses() {
        //return null;这里不传，即不创建spring容器只用springmvc容器也是可以的。
        return new Class[]{SpringConfig.class};
    }

    //web容器，子容器，即mvc配置类
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{MvcConfig.class};
    }

    //dispacherservlet的映射信息
    // /是拦截所欲请求，包括静态资源（js，png等）但是不包括jsp
    // /*是拦截包括jsp的所有请求
    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }

    //AbstractDispatcherServletInitializer暴露了获取过滤器的方法，并进行了注册。
    @Override
    protected Filter[] getServletFilters() {
        CharacterEncodingFilter filter =new CharacterEncodingFilter();
        filter.setEncoding("utf-8");
        filter.setForceEncoding(true);
        return new Filter[]{filter};
    }


}
